Background

Notes and format last updated Apr 9, 2020

Growth rates

Confirmed cases (total and new)

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.US
agg.cases.US[, total_cases_prev3 := temp$total_cases[match(agg.cases.US$date - 3, temp$date)]]
agg.cases.US[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.US[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.US
agg.cases.US[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.US$date - 1, temp$date)]]
agg.cases.US[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.US[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.US.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = "United States",
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.US.plot

Our states

use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

Deaths (total and new)

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.US
agg.deaths.US[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.US$date - 3, temp$date)]]
agg.deaths.US[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.US[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.US
agg.deaths.US[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.US$date - 1, temp$date)]]
agg.deaths.US[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.US[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.US.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = "United States",
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.US.plot

Our states

use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]
melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

By population rankings

States

Total confirmed cases

Table of total confirmed cases per million residents (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
state.per.cap[, casesPerMillion := as.integer(cases/population * 1000000)]
date.cut <- max(state.per.cap$date)
state.per.cap.agg <- state.per.cap[date == date.cut]
state.per.cap.agg <- state.per.cap.agg[order(-casesPerMillion), c("state", "casesPerMillion")]
state.per.cap.agg[, casesPerMillion := comma(casesPerMillion)]
state.per.cap.agg
##                        state casesPerMillion
##  1:                 New York           9,699
##  2:               New Jersey           6,963
##  3:                Louisiana           4,430
##  4:            Massachusetts           3,696
##  5:              Connecticut           3,375
##  6:     District of Columbia           2,656
##  7:             Rhode Island           2,515
##  8:                 Michigan           2,452
##  9:             Pennsylvania           1,793
## 10:                 Delaware           1,668
## 11:                 Illinois           1,645
## 12:               Washington           1,367
## 13:                 Maryland           1,360
## 14:                 Colorado           1,268
## 15:                  Indiana           1,177
## 16:                  Vermont           1,165
## 17:                  Georgia           1,139
## 18:              Mississippi             934
## 19:                   Nevada             928
## 20:                  Florida             925
## 21:             South Dakota             825
## 22:                    Idaho             797
## 23:                Tennessee             753
## 24:                  Alabama             730
## 25:            New Hampshire             724
## 26:                     Utah             718
## 27:                 Missouri             677
## 28:           South Carolina             644
## 29:                 Virginia             617
## 30:               New Mexico             593
## 31:               California             590
## 32:                Wisconsin             573
## 33:                     Ohio             564
## 34:                     Iowa             502
## 35:                 Oklahoma             497
## 36:                  Arizona             486
## 37:                    Texas             475
## 38:                    Maine             470
## 39:                  Wyoming             466
## 40:                   Kansas             459
## 41:                 Kentucky             439
## 42:           North Carolina             430
## 43:                 Arkansas             424
## 44:                 Nebraska             423
## 45:             North Dakota             404
## 46:                   Alaska             369
## 47:                  Montana             362
## 48:                   Oregon             362
## 49:                   Hawaii             351
## 50:            West Virginia             343
## 51:                Minnesota             287
## 52:              Puerto Rico             280
## 53:           American Samoa            <NA>
## 54:                     Guam            <NA>
## 55: Northern Mariana Islands            <NA>
## 56:           Virgin Islands            <NA>
##                        state casesPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-01"], aes(x = date, y = casesPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "Total confirmed COVID cases per million residents",
       title = "Total confirmed COVID cases per million residents",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
state.per.cap.plot

New confirmed cases

Table of new cases per million residents: rolling 3-day total (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
date.cut <- max(state.per.cap$date)
date.min <- max(state.per.cap$date) - 3
state.per.cap.agg <- state.per.cap[date == date.cut]
temp <- state.per.cap[date == date.min]
state.per.cap.agg[, casesPrev3 := temp$cases[match(state.per.cap.agg$state, temp$state)]]
state.per.cap.agg[, newCasesPrev3 := (cases - casesPrev3)]
state.per.cap.agg[, casesNewPerMillion := as.integer(newCasesPrev3/population * 1000000)]
state.per.cap.agg <- state.per.cap.agg[order(-casesNewPerMillion), c("state", "casesNewPerMillion")]
state.per.cap.agg[, casesNewPerMillion := comma(casesNewPerMillion)]
state.per.cap.agg
##                        state casesNewPerMillion
##  1:                 New York              1,478
##  2:               New Jersey              1,218
##  3:            Massachusetts                947
##  4:             Rhode Island                885
##  5:              Connecticut                631
##  6:     District of Columbia                498
##  7:                Louisiana                497
##  8:                 Delaware                427
##  9:             Pennsylvania                357
## 10:                 Illinois                349
## 11:                 Maryland                337
## 12:             South Dakota                319
## 13:                 Michigan                312
## 14:                  Indiana                234
## 15:                 Colorado                191
## 16:              Mississippi                175
## 17:                  Vermont                158
## 18:                  Alabama                151
## 19:                 Virginia                144
## 20:                  Florida                142
## 21:                   Nevada                131
## 22:            New Hampshire                122
## 23:               New Mexico                122
## 24:                 Nebraska                116
## 25:                  Georgia                114
## 26:               Washington                105
## 27:           South Carolina                102
## 28:                 Missouri                101
## 29:                     Iowa                100
## 30:                Tennessee                100
## 31:                     Utah                100
## 32:                 Kentucky                 98
## 33:                     Ohio                 93
## 34:           North Carolina                 82
## 35:                    Texas                 82
## 36:               California                 79
## 37:                Wisconsin                 78
## 38:                   Kansas                 76
## 39:                 Oklahoma                 72
## 40:                  Arizona                 71
## 41:                Minnesota                 67
## 42:              Puerto Rico                 67
## 43:                    Maine                 54
## 44:                  Wyoming                 53
## 45:             North Dakota                 51
## 46:                   Alaska                 50
## 47:            West Virginia                 50
## 48:                   Oregon                 48
## 49:                 Arkansas                 44
## 50:                   Hawaii                 40
## 51:                    Idaho                 40
## 52:                  Montana                 30
## 53:           American Samoa               <NA>
## 54:                     Guam               <NA>
## 55: Northern Mariana Islands               <NA>
## 56:           Virgin Islands               <NA>
##                        state casesNewPerMillion

Total deaths

Table of total deaths per million residents (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
state.per.cap[, deathsPerMillion := as.integer(deaths/population * 1000000)]
date.cut <- max(state.per.cap$date)
state.per.cap.agg <- state.per.cap[date == date.cut]
state.per.cap.agg <- state.per.cap.agg[order(-deathsPerMillion), c("state", "deathsPerMillion")]
state.per.cap.agg[, deathsPerMillion := comma(deathsPerMillion)]
state.per.cap.agg
##                        state deathsPerMillion
##  1:                 New York              482
##  2:               New Jersey              264
##  3:                Louisiana              180
##  4:              Connecticut              155
##  5:                 Michigan              148
##  6:            Massachusetts              109
##  7:     District of Columbia               70
##  8:               Washington               67
##  9:             Rhode Island               59
## 10:                 Illinois               57
## 11:                 Colorado               50
## 12:                  Indiana               50
## 13:                  Vermont               43
## 14:                  Georgia               41
## 15:             Pennsylvania               41
## 16:                 Maryland               39
## 17:                   Nevada               36
## 18:                 Delaware               35
## 19:              Mississippi               32
## 20:                 Oklahoma               24
## 21:                Wisconsin               24
## 22:                  Florida               21
## 23:                 Kentucky               21
## 24:                     Ohio               21
## 25:                   Kansas               19
## 26:                  Alabama               18
## 27:                 Missouri               18
## 28:               California               17
## 29:                  Arizona               16
## 30:            New Hampshire               16
## 31:                 Virginia               16
## 32:                    Idaho               15
## 33:           South Carolina               15
## 34:                Tennessee               15
## 35:                    Maine               14
## 36:              Puerto Rico               13
## 37:                     Iowa               12
## 38:                Minnesota               12
## 39:               New Mexico               12
## 40:                   Oregon               12
## 41:             North Dakota               10
## 42:                 Nebraska                9
## 43:                    Texas                9
## 44:                   Alaska                8
## 45:                 Arkansas                8
## 46:           North Carolina                8
## 47:                   Hawaii                6
## 48:             South Dakota                6
## 49:                  Montana                5
## 50:                     Utah                5
## 51:            West Virginia                4
## 52:                  Wyoming                0
## 53:           American Samoa             <NA>
## 54:                     Guam             <NA>
## 55: Northern Mariana Islands             <NA>
## 56:           Virgin Islands             <NA>
##                        state deathsPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-01"], aes(x = date, y = deathsPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "Total COVID-related deaths per million residents",
       title = "Total COVID-related deaths per million residents",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
state.per.cap.plot

New deaths

Table of new deaths per million residents: rolling 3-day total (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
date.cut <- max(state.per.cap$date)
date.min <- max(state.per.cap$date) - 3
state.per.cap.agg <- state.per.cap[date == date.cut]
temp <- state.per.cap[date == date.min]
state.per.cap.agg[, deathsPrev3 := temp$deaths[match(state.per.cap.agg$state, temp$state)]]
state.per.cap.agg[, newDeathsPrev3 := (deaths - deathsPrev3)]
state.per.cap.agg[, deathsNewPerMillion := as.integer(newDeathsPrev3/population * 1000000)]
state.per.cap.agg <- state.per.cap.agg[order(-deathsNewPerMillion), c("state", "deathsNewPerMillion")]
state.per.cap.agg[, deathsNewPerMillion := comma(deathsNewPerMillion)]
state.per.cap.agg
##                        state deathsNewPerMillion
##  1:                 New York                 119
##  2:               New Jersey                  73
##  3:              Connecticut                  48
##  4:                 Michigan                  41
##  5:            Massachusetts                  36
##  6:                Louisiana                  29
##  7:     District of Columbia                  25
##  8:             Rhode Island                  18
##  9:                 Maryland                  16
## 10:                 Illinois                  15
## 11:                  Indiana                  14
## 12:             Pennsylvania                  14
## 13:                 Delaware                  12
## 14:                 Colorado                  10
## 15:                   Nevada                  10
## 16:               Washington                   7
## 17:              Mississippi                   6
## 18:                  Vermont                   6
## 19:                  Florida                   4
## 20:                     Iowa                   4
## 21:                   Kansas                   4
## 22:               New Mexico                   4
## 23:                 Oklahoma                   4
## 24:                Wisconsin                   4
## 25:                  Alabama                   3
## 26:                  Arizona                   3
## 27:               California                   3
## 28:                 Kentucky                   3
## 29:                Minnesota                   3
## 30:                 Missouri                   3
## 31:             North Dakota                   3
## 32:                     Ohio                   3
## 33:              Puerto Rico                   3
## 34:                 Virginia                   3
## 35:                  Georgia                   2
## 36:                   Hawaii                   2
## 37:                    Maine                   2
## 38:           South Carolina                   2
## 39:                    Texas                   2
## 40:                   Alaska                   1
## 41:                 Arkansas                   1
## 42:                    Idaho                   1
## 43:                 Nebraska                   1
## 44:            New Hampshire                   1
## 45:           North Carolina                   1
## 46:                   Oregon                   1
## 47:                Tennessee                   1
## 48:                     Utah                   1
## 49:            West Virginia                   1
## 50:                  Montana                   0
## 51:                  Wyoming                   0
## 52:             South Dakota                  -1
## 53:           American Samoa                <NA>
## 54:                     Guam                <NA>
## 55: Northern Mariana Islands                <NA>
## 56:           Virgin Islands                <NA>
##                        state deathsNewPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
temp <- state.per.cap.series[, c("state", "date", "deaths")]
setnames(temp, "deaths", "deathsPrev3")
state.per.cap.series[, datePrev3 := date - 3]
state.per.cap.series <- merge(state.per.cap.series, temp, all.x = T, by.x = c("state", "datePrev3"), by.y = c("state", "date"))
state.per.cap.series[, newDeathsPrev3 := (deaths - deathsPrev3)]
state.per.cap.series[, deathsNewPerMillion := as.integer(newDeathsPrev3/population * 1000000)]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-10"], aes(x = date, y = deathsNewPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "New COVID-related deaths per million residents",
       title = "New COVID-related deaths per million resident (3-day rolling total)",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
state.per.cap.plot

Counties

Confirmed cases

Table showing total cases per million and percentile for all US counties. Includes our counties and the top 5 in the US for perspective.

##          county          state casesPerMillion rawRanking percentile
##  1:    Rockland       New York          23,699          1         99
##  2: Westchester       New York          19,962          2         99
##  3:      Blaine          Idaho          19,721          3         99
##  4:      Nassau       New York          17,358          4         99
##  5:    Randolph        Georgia          16,377          5         99
##  6:    Davidson      Tennessee           1,942        144         95
##  7:    Richland South Carolina           1,188        318         89
##  8:      Pierce     Washington           1,035        386         87
##  9:        York South Carolina             477        947         69
## 10:      Orange     California             402       1140         63

Our county percentiles over time

Deaths

Table showing total deaths per million and percentile for all US counties. Includes our counties and the top 5 in the US for perspective.

##        county          state deathsPerMillion rawRanking percentile
##  1:   Terrell        Georgia            1,172          1         99
##  2: Dougherty        Georgia              819          2         99
##  3:    Nassau       New York              759          3         99
##  4:  Randolph        Georgia              738          4         99
##  5:     Greer       Oklahoma              700          5         99
##  6:  Richland South Carolina               24        571         81
##  7:    Pierce     Washington               22        602         80
##  8:  Davidson      Tennessee               19        668         78
##  9:      York South Carolina               11        828         73
## 10:    Orange     California                6        921         70

Our county percentiles over time

Raw counts

Total confirmed cases

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.US.plot <- ggplot(agg.cases.US[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.US.plot

Our states

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

Our counties

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
use.county <- "Pierce"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "California"
use.county <- "Orange"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "Richland"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "York"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
use.county <- "Davidson"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

New confirmed cases

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.US
agg.cases.US[, total_cases_prev := temp$total_cases[match(agg.cases.US$date - 1, temp$date)]]
agg.cases.US[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.US.plot <- ggplot(agg.cases.US[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.US.plot

Our states

use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

Our counties

use.state <- "Washington"
use.county <- "Pierce"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "California"
use.county <- "Orange"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "South Carolina"
use.county <- "Richland"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "Tennessee"
use.county <- "Davidson"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

Total deaths

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.US.plot <- ggplot(agg.deaths.US[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.deaths.US.plot

Our states

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

Our counties

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
use.county <- "Pierce"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "California"
use.county <- "Orange"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "Richland"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "York"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
use.county <- "Davidson"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

New deaths

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.US
agg.deaths.US[, total_deaths_prev := temp$total_deaths[match(agg.deaths.US$date - 1, temp$date)]]
agg.deaths.US[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.US.plot <- ggplot(agg.deaths.US[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.deaths.US.plot

Our states

use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

Our counties

use.state <- "Washington"
use.county <- "Pierce"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "California"
use.county <- "Orange"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "South Carolina"
use.county <- "Richland"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "South Carolina"
use.county <- "York"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "Tennessee"
use.county <- "Davidson"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

Stay-at-home comparisons

state.dt <- state.raw
state.dt[, stay_date := stay_dates$start_date[match(state.raw$state, stay_dates$state)]]
state.dt[, population := stay_dates$population[match(state.raw$state, stay_dates$state)]]
#state.dt[, flgOrder := ifelse(is.na(stay_date), 0, 1)]
state.dt[, flgOrder := ifelse(is.na(stay_date) | stay_date >= date, "No", "Yes")]
#state.dt[, ctDaysFromBaseline := ifelse(flgOrder == 0, as.integer(date - as.Date("2020-03-10")),
#                                         as.integer(date - stay_date))]
#state.dt[, ctDaysFromBaseline := as.integer(date - stay_date)]
temp <- state.dt
temp <- temp[, c("date", "state", "cases")]
setnames(temp, "cases", "cases_prev3")
state.dt[, dtPrev3 := date - 3]
state.dt <- merge(state.raw, temp, all.x = T, by.x = c("state", "dtPrev3"), by.y = c("state", "date"))
state.dt[, casesNewPerMillion := as.integer((cases - cases_prev3)/population * 1000000)]
state.agg.comp <- state.dt[date >= "2020-03-10" & !state %in% "Puerto Rico"]
state.agg.comp <- state.agg.comp[order(date, flgOrder),
                          .(avgNewCases = mean(casesNewPerMillion, na.rm = T),
                            cts = .N),
                           by = c("date", "flgOrder")]
state.agg.comp.plot <- ggplot(state.agg.comp, aes(x = date, y = avgNewCases, colour = as.factor(flgOrder))) +
  geom_point(aes(size = cts)) +
  geom_line(aes(group = flgOrder)) +
    labs(x = "Date",
       y = "New confirmed COVID cases per million residents",
       title = "New COVID cases vs.stay-at-home order",
       subtitle = "Average of 3-day rolling totals per million residents",
       size = "Count of states",
       colour = "Stay-at-home order") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
state.agg.comp.plot